package com.yy.main.app.web.base;

import com.github.pagehelper.PageInfo;
import com.yy.constant.AppConstant;
import com.yy.kit.collections.YYMapKits;
import com.yy.main.app.service.IPermissionService;
import com.yy.pojo.base.TUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * <p>
 * 所有的controller均需要继承此类，包含一些公共方法
 * </p>
 *
 * @author 杨阳
 * @since 2017年9月1日9:41:02
 */
@Component
@Api(value = "基础controller", description = "所有controller都要继承此类，定义了一些跳转方法")
public class CommonController {

    @Resource(name = "iPermissionService")
    private IPermissionService iPermissionService;

    /**
     * <p>
     * 统一通过ModelAndView方法进行跳转，所有controller中跳转都需要通过此方法
     * </p>
     *
     * @param viewName 视图名称
     * @param params   转递到二第个页面的参数
     * @return {@link ModelAndView}
     */
    @ApiOperation(value = "统一跳转页面方法")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "viewName", value = "跳转页面的名字", required = true),
            @ApiImplicitParam(name = "params", value = "跳转页面后携带的参数,如果没有参数可以传null", required = true)
    })
    public ModelAndView goToPageByModelAndView(String viewName, Map<String, Object> params) {
        ModelAndView view = new ModelAndView();
        if (null == params) {
            params = YYMapKits.createHashMap();
        }
        view.addAllObjects(params);
        view.setViewName(viewName);
        return view;
    }

    /**
     * <p>
     * 统一通过ModelAndView方法进行跳转，所有controller中跳转都需要通过此方法
     * </p>
     *
     * @param viewName 视图名称
     * @param params   转递到二第个页面的参数
     * @return {@link ModelAndView}
     */
    @ApiOperation(value = "统一跳转页面方法", notes = "通过此方法跳转可以自动将用户所拥有的权限带到下一个页面，判断用户显示哪些按钮")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "viewName", value = "跳转页面的名字", required = true),
            @ApiImplicitParam(name = "params", value = "跳转页面后携带的参数,如果没有参数可以传null", required = true),
            @ApiImplicitParam(name = "userid", value = "用户id", required = true)
    })
    public ModelAndView goToPageByModelAndView(String viewName, Map<String, Object> params, String userid) {
        ModelAndView view = new ModelAndView();
        if (null == params) {
            params = YYMapKits.createHashMap();
        }
        params.put(AppConstant.PERMISSION_KEY, iPermissionService.getUserPerAuthentication(userid));
        view.addAllObjects(params);
        view.setViewName(viewName);
        return view;
    }

    /**
     * <p>
     * 查询表格的时候使用，将Page对象转换为管理端表格认识的数据
     * </p>
     *
     * @param page 包含了分页的数据以及总页数等信息
     * @return {@link Map}
     */
    @SuppressWarnings("rawtypes")
    @ApiOperation(value = "查询表格的时候使用，将Page对象转换为管理端表格认识的数据")
    protected Map<String, Object> pageToMap(PageInfo page) {
        Map<String, Object> map = YYMapKits.createHashMap();
        map.put("code", "0");
        map.put("msg", "加载成功");
        map.put("count", page.getTotal());
        map.put("data", page.getList());
        return map;
    }

    /**
     * <p>
     * 获取当前session中的用户
     * </p>
     *
     * @param session WEB汇话
     * @return {@link TUser}
     * @author 杨阳
     * @since 2017年9月7日
     */
    @ApiOperation(value = "获取当前session中的用户")
    protected TUser getCurrentUser(HttpSession session) {
        return (TUser) session.getAttribute(AppConstant.SESSION_KEY);
    }

    /**
     * <p>
     * 返回一个带有success=true,msg=msg的map
     * </p>
     *
     * @param msg 提示信息
     * @return {@link Map}<String, Object>
     * @author 杨阳
     * @since 2017年9月25日
     */
    @ApiOperation(value = "返回一个带有success=true,msg=msg的map")
    protected Map<String, Object> successMap(String msg) {
        Map<String, Object> map = YYMapKits.createHashMap();
        map.put("success", Boolean.TRUE);
        map.put("msg", msg);
        return map;
    }

    /**
     * <p>
     * 返回一个带有success=false,msg=msg的map
     * </p>
     *
     * @param msg 提示信息
     * @return {@link Map}<String, Object>
     * @author 杨阳
     * @since 2017年9月25日
     */
    @ApiOperation(value = "返回一个带有success=false,msg=msg的map")
    protected Map<String, Object> errorMap(String msg) {
        Map<String, Object> map = YYMapKits.createHashMap();
        map.put("success", Boolean.FALSE);
        map.put("msg", msg);
        return map;
    }

    /**
     * <p>
     * 返回一个提示成功信息的map
     * </p>
     *
     * @param msg 提示信息
     * @return {@link Map<String, Object>}
     * @author 杨阳
     * @since 2017年12月4日
     */
    public Map<String, Object> writeSuccess(String msg) {
        Map<String, Object> map = YYMapKits.createHashMap();
        map.put("success", Boolean.TRUE);
        map.put("msg", msg);
        return map;
    }

    /**
     * <p>
     * 返回一个提示成功信息的map
     * </p>
     *
     * @param msg 提示信息
     * @return {@link Map<String, Object>}
     * @author 杨阳
     * @since 2017年12月4日
     */
    public Map<String, Object> writeError(String msg) {
        Map<String, Object> map = YYMapKits.createHashMap();
        map.put("success", Boolean.FALSE);
        map.put("msg", msg);
        return map;
    }
}
